﻿using System;
using System.Data;
using DTO.Clases;
using Npgsql;

namespace DataAccessLayer.Clases
{
    /// <summary>
    /// 
    /// </summary>
    public class DaoProductoFacturaProveedor
    {
        #region Tranzación a base de datos.

        /// <summary>
        /// Objeto que me permite a acceder a la conexión a base de datos PostgreSQL.
        /// </summary>
        private Conexion miConexion;

        /// <summary>
        /// Representa un comando de ejecucion de sentencias SQL a PostgreSQL.
        /// </summary>
        private NpgsqlCommand miComando;

        #endregion

        #region Funciones

        /// <summary>
        /// Representa la funcion: insertar_producto_factura_proveedor.
        /// </summary>
        private const string InsertarProductoFactura = "insertar_producto_factura_proveedor";

        /// <summary>
        /// Representa la función editar_producto_factura_proveedor.
        /// </summary>
        private const string EditarProductoFactura = "editar_producto_factura_proveedor";

        /// <summary>
        /// Representa la Función eliminar_producto_factura_proveedor.
        /// </summary>
        private const string EliminarProductoFactura = "eliminar_producto_factura_proveedor";

        #endregion

        #region Mensajes

        /// <summary>
        /// Representa el texto: Ocurrió un error al ingresar el registro del Producto.
        /// </summary>
        private const string ErrorInsertar = "Ocurrió un error al ingresar el registro del Producto.\n";

        /// <summary>
        /// Representa el texto: Ocurrió un error al editar los datos del Producto.
        /// </summary>
        private const string ErrorEditar = "Ocurrió un error al editar los datos del Producto.\n";

        /// <summary>
        /// Ocurrió un error al eliminar el registro de Producto.
        /// </summary>
        private const string ErrorEliminar = "Ocurrió un error al eliminar el registro de Producto.\n";

        #endregion

        /// <summary>
        /// 
        /// </summary>
        public DaoProductoFacturaProveedor()
        {
            this.miConexion = new Conexion();
        }

        /// <summary>
        /// Ingresa un registro de ProductoFacturaProveedor estableciendo la relacion necesaria.
        /// </summary>
        /// <param name="productos">Registro de ProductoFacturaProveedor a ingresar.</param>
        public void IngresarProductoFacturaProveedor(ProductoFacturaProveedor productos)
        {
            try
            {
                CargarComando(InsertarProductoFactura);
                miComando.Parameters.AddWithValue("factura", productos.IdFactura);
                miComando.Parameters.AddWithValue("producto", productos.Producto.CodigoInternoProducto);
                miComando.Parameters.AddWithValue("medida", productos.Inventario.IdMedida);
                miComando.Parameters.AddWithValue("color", productos.Inventario.IdColor);
                miComando.Parameters.AddWithValue("lote", productos.Lote.Id);
                miComando.Parameters.AddWithValue("cantidad", productos.Cantidad);
                miComando.Parameters.AddWithValue("valor", productos.Producto.ValorVentaProducto);
                miComando.Parameters.AddWithValue("iva", productos.Producto.ValorIva);
                miComando.Parameters.AddWithValue("descuento", productos.Producto.Descuento);
                miConexion.MiConexion.Open();
                miComando.ExecuteNonQuery();
                miConexion.MiConexion.Close();
                miComando.Dispose();
            }
            catch (Exception ex)
            {
                throw new Exception(ErrorInsertar + ex.Message);
            }
            finally { miConexion.MiConexion.Close(); }
        }

        /// <summary>
        /// Edita los datos de un registro de ProductoFacturaProveedor en base de datos.
        /// </summary>
        /// <param name="producto">Registro de ProductoFacturaProveedor a editar.</param>
        public void EditarProductoFacturaProveedor(ProductoFacturaProveedor producto)
        {
            try
            {
                CargarComando(EditarProductoFactura);
                if (producto.Lote.Id == 0)
                {
                    var daoLote = new DaoLote();
                    producto.Lote.Id = daoLote.IngresarLote(producto.Lote);
                }
                miComando.Parameters.AddWithValue("id", producto.Id);
                miComando.Parameters.AddWithValue("factura", producto.IdFactura);
                miComando.Parameters.AddWithValue("producto", producto.Producto.CodigoInternoProducto);
                miComando.Parameters.AddWithValue("medida", producto.Inventario.IdMedida);
                miComando.Parameters.AddWithValue("color", producto.Inventario.IdColor);
                miComando.Parameters.AddWithValue("lote", producto.Lote.Id);
                miComando.Parameters.AddWithValue("cantidad", producto.Cantidad);
                miComando.Parameters.AddWithValue("valor", producto.Producto.ValorVentaProducto);
                miComando.Parameters.AddWithValue("iva", producto.Producto.ValorIva);
                miComando.Parameters.AddWithValue("descuento", producto.Producto.Descuento);
                miConexion.MiConexion.Open();
                miComando.ExecuteNonQuery();
                miConexion.MiConexion.Close();
                miComando.Dispose();
            }
            catch (Exception ex)
            {
                throw new Exception(ErrorEditar + ex.Message);
            }
            finally { miConexion.MiConexion.Close(); }
        }

        /// <summary>
        /// Elimina un registro de Producto de Factura Proveedor.
        /// </summary>
        /// <param name="id">Id del registro del Producto a eliminar.</param>
        public void EliminarProductoFacturaProveedor(int id)
        {
            try
            {
                CargarComando(EliminarProductoFactura);
                miComando.Parameters.AddWithValue("id", id);
                miConexion.MiConexion.Open();
                miComando.ExecuteNonQuery();
                miConexion.MiConexion.Close();
                miComando.Dispose();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally { miConexion.MiConexion.Close(); }
        }

        /// <summary>
        /// Inicializa una nueva instancia de NpgsqlCommand de tipo StoredProcedure.
        /// </summary>
        /// <param name="cmd">Comando a ejecutar.</param>
        private void CargarComando(string cmd)
        {
            miComando = new NpgsqlCommand();
            miComando.Connection = miConexion.MiConexion;
            miComando.CommandType = CommandType.StoredProcedure;
            miComando.CommandText = cmd;
        }
    }
}